<?php

declare(strict_types=1);

namespace Zms\Unit;

use Exception;

class Is
{

    /**
     * 判断字符串是否JSON
     * @param $data
     * @return bool
     */
    public static function json($data): bool
    {
        if (gettype($data) !== 'string') {
            return false;
        }
        if (function_exists('json_validate')) {
            return json_validate($data);
        }
        try {
            if (extension_loaded('json')) {
                $value = json_decode($data);
                if (is_null($value) || json_last_error()) {
                    return false;
                }
                return true;
            }
            return false;
        } catch (Exception $exception) {
            return false;
        }
    }

    /**
     * 判断数组是否是列表
     * @param mixed $list 数据
     * @param string|null $type 列表类型
     * @return bool
     */
    public static function list($list, $type = null): bool
    {
        if (!is_array($list)) {
            return false;
        }
        $sort = 0;
        foreach ($list as $index => $item) {
            if ($sort != $index) {
                return false;
            }
            if ($type && gettype($item) !== $type) {
                return false;
            }
            $sort++;
        }
        return true;
    }

    /**
     * 判断值是否非空值,只判断了字符串,数组,数字
     * @param mixed $value
     * @return bool
     */
    public static function notEmpty($value): bool
    {
        if (is_array($value)) {
            return count($value) > 0;
        } elseif (is_string($value)) {//非字符和数组类型视空
            return strlen($value) > 0 && $value !== ' ';
        } elseif (is_numeric($value)) {//非字符和数组类型视空
            return true;
        }
        return false;
    }


    /**
     * 判断内容是否为空
     * @param $value
     * @return bool
     */
    public static function empty($value): bool
    {
        if (empty($value)) {
            if ($value === 0 || $value === '0') {
                return false;
            }
            return true;
        }
        return false;
    }


    /**
     * @describe 是否是字符串列表
     * @user zlf <zms-pro@qq.com> 2025/8/29
     * @param $list
     * @return bool
     */
    public static function stringList($list): bool
    {
        if (self::list($list) === false) {
            return false;
        }
        foreach ($list as $item) {
            if (!is_string($item)) {
                return false;
            }
        }
        return true;
    }


    /** 判断列表是否是数字列表
     * @describe
     * @user zlf <zms-pro@qq.com> 2025/8/29
     * @param $list
     * @return bool
     */
    public static function numberList($list): bool
    {
        if (self::list($list) === false) {
            return false;
        }
        foreach ($list as $item) {
            if (!is_numeric($item)) {
                return false;
            }
        }
        return true;
    }


    /**
     * @describe 判断字符是否是整数列表
     * @user zlf <zms-pro@qq.com> 2025/8/29
     * @param $list
     * @param bool $strict
     * @return bool
     */
    public static function intList($list, bool $strict = false): bool
    {
        if (self::list($list) === false) {
            return false;
        }
        foreach ($list as $item) {
            if (self::empty($item)) return false;
            if ($strict) {//严格模式
                if (!is_int($item)) return false;
            } else {
                if (!preg_match('/^-?\d+$/', (string)$item)) {
                    return false;
                }
            }
        }
        return true;
    }


    /**
     * @describe 值是否是整数
     * @user zlf <zms-pro@qq.com> 2025/10/22
     * @param $value
     * @param $strict
     * @return bool
     */
    public static function isIntegerValue($value, $strict = false): bool
    {
        if (is_integer($value)) return true;
        if ($strict) return false;
        if (!is_numeric($value)) return false;
        return !preg_match('/\./', (string)$value);
    }

    /**
     * @describe 值是否是小数
     * @user zlf <zms-pro@qq.com> 2025/10/22
     * @param $value
     * @param $strict
     * @return bool
     */
    public static function isFloatValue($value, $strict = false): bool
    {
        if (is_float($value)) return true;
        if ($strict) return false;
        if (!is_numeric($value)) return false;
        return (bool)preg_match('/\./', (string)$value);
    }
}